#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>


int main(int argc, char *argv[])
{
    /**
     * @note 在fork子进程之前的值 \
     * fork时会把之前的变量都会复制给子进程，但是父子进程内进程内存 \
     * 彼此独立 没有共享 ，所以再改变之前的值 互相都不会有影响
     */
    int num = 100;

    __pid_t pid = fork();

    if (pid > 0)
    {
        printf("父进程pid: %d ppid: %d\n", getpid(),getppid());
        sleep(3);
        printf("parent num = %d\n",num);
    }
    else if (pid == 0)
    {
        printf("子进程pid: %d ppid: %d\n", getpid(),getppid());
        printf("chile num = %d\n",num);
        num++;
        /**
         * @note 父进程的结束不会让子进程结束 \
         * 父进程结束会造成子进程被托管给系统 成为僵尸（孤儿）进程 \
         * 要避免这种情况 \
         */
        // 让子进程执行一个ping操作 ping www.baidu.com
        char *exe_path = "/usr/bin/ping";
        char *args[] = {"ping","-c 2","www.baidu.com",NULL};
        char *env[1] = {NULL};
        execve(exe_path,args,env); // 子进程执行execve 替换了子进程原有程序
        _exit(EXIT_FAILURE); // 子进程退出  使用_exit不会对主进程 影响
    }
    else
    {
        printf("fork error\n");
        exit(EXIT_FAILURE);
    }
    printf("process pid = %d\n,ppid = %d\n",getpid(),getppid());
    int status;
    // waitpid(pid,&status,WUNTRACED);
    int subpid = waitpid(pid,&status,WNOHANG);
    printf("main process exit sub process exit code is %d  %d\n",status,subpid);
    return 0;
}